/*************************************************
 * 描述: 全局委托路由
 *
 * File: globaldelegaterouter.h
 * Author: shizhixin@mozihealthcare.cn
 * Date: 2025-10-21
 * Update: 
 * ************************************************/
#ifndef COREXI_COMMON_PC_GLOBALDELEGATEROUTER_H
#define COREXI_COMMON_PC_GLOBALDELEGATEROUTER_H

#include <QStyledItemDelegate>
#include <QHash>

class ColumnDelegateRouter;

class GlobalDelegateRouter : public QStyledItemDelegate
{
public:
	/**
	 * @brief 构造函数
	 * @param parent
	 */
	explicit GlobalDelegateRouter(QObject* parent = nullptr);

	/**
	 * @brief 设置默认委托
	 * @param delegate 默认委托
	 */
	void setDefaultDelegate(QStyledItemDelegate* delegate);

	/**
	 * @brief 设置列级委托路由
	 * @param column 列索引
	 * @param router 列级委托路由
	 */
	void setColumnRouter(int column, ColumnDelegateRouter* router);

	/**
	 * @brief 获取列级委托路由
	 * @param column 列索引
	 * @return 列级委托路由
	 */
	ColumnDelegateRouter* columnRouter(int column) const;

	/**
	 * @brief 设置单元格委托
	 * @param row 行索引
	 * @param column 列索引
	 * @param delegate 单元格委托
	 */
	void setCellDelegate(int row, int column, QStyledItemDelegate* delegate);

	/**
	 * @brief 获取单元格委托
	 * @param row 行索引
	 * @param column 列索引
	 * @return 单元格委托
	 */
	QStyledItemDelegate* cellDelegate(int row, int column) const;

protected:
	// 统一重写的转发接口
	QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;

	void setEditorData(QWidget* editor, const QModelIndex& index) const override;

	void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override;

	void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;

private:
	/**
	 * @brief 获取索引对应的委托
	 * @param index 索引
	 * @return 索引对应的委托
	 */
	QStyledItemDelegate* delegateForIndex(const QModelIndex& index) const;

	/**
	 * @brief 递归映射索引到源模型
	 * @param index 索引
	 * @return 源模型索引
	 */
	static QModelIndex mapToSourceRecursive(const QModelIndex &index);

private:
	// 列级别委托路由hash
	QHash<int, ColumnDelegateRouter*> m_columnRouters;
	// 全局默认委托
	QStyledItemDelegate* m_defaultRouter;
};


#endif //COREXI_COMMON_PC_GLOBALDELEGATEROUTER_H